package MUSI.Deusto.curso20112012.clienteTwitter;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import twitter4j.ResponseList;
import twitter4j.TwitterException;
import twitter4j.TwitterFactory;
import twitter4j.auth.AccessToken;
import MUSI.Deusto.curso20112012.MUSIDeustoActivity;
import android.content.SharedPreferences.Editor;
import android.os.AsyncTask;

/**
 * 
 * @author PatxiGG
 */
public class TwitterJ extends AsyncTask<String, Integer, List<String>> {

	// private Twitter twitter = null;
	private MUSIDeustoActivity actividad = null;
	private static final String INITIALIZED = "initialized";
	private static final String TOKEN_SECRET = "TokenSecret";
	private static final String ACCESS_TOKEN = "AccessToken";

	public TwitterJ(MUSIDeustoActivity actividad) {
		// asociamos el cliente con la actividad
		this.actividad = actividad;

		// verificamos a ver si existen los datos que necesitamos de esta
		// aplicacion en el dispositivo
		// Obtiene el objeto de preferencias de la aplicacion llamado
		// preferencias. Podeis indicar el nombre que querais.

		if (ConstantesTwitter.SHARED_PREFERENCES == null) {
			ConstantesTwitter.SHARED_PREFERENCES = this.actividad
					.getApplicationContext().getSharedPreferences(
							"preferencias", 0);
		}
		// creamos la instancia a el cliente twitter
		if (ConstantesTwitter.TWITTER == null) {
			ConstantesTwitter.TWITTER = new TwitterFactory().getInstance();
			// autenticamos al cliente para el usuario
			ConstantesTwitter.TWITTER.setOAuthConsumer(
					ConstantesTwitter.CONSUMER_KEY,
					ConstantesTwitter.CONSUMER_SECRET);
		}

	}

	private boolean clienteTieneDatosQueNecesita() {
		boolean resultado = false;
		if ((ConstantesTwitter.SHARED_PREFERENCES.getString(ACCESS_TOKEN, null)) != null) {
			if ((ConstantesTwitter.SHARED_PREFERENCES.getString(TOKEN_SECRET,
					null)) != null) {
				resultado = true;
			}
		}
		return resultado;
	}

	private void iniciarElCliente() throws TwitterException, IOException {
		if (this.iniciado() == true) {
			// si ya esta iniciado, obtenemos las claves que necesitamos
			AccessToken oathAccessToken = new AccessToken(
					ConstantesTwitter.SHARED_PREFERENCES.getString(
							ACCESS_TOKEN, null),
					ConstantesTwitter.SHARED_PREFERENCES.getString(
							TOKEN_SECRET, null));
			ConstantesTwitter.TWITTER.setOAuthAccessToken(oathAccessToken);

		} else {
			// el cliente no ha sido iniciado
			// tenemos que iniciarlo
			ConstantesTwitter.REQUEST_TOKEN = ConstantesTwitter.TWITTER
					.getOAuthRequestToken();
			// le mostramos al usuario la opcion para que autorice a la
			// aplicacion
			this.actividad.permitirTwitter(ConstantesTwitter.REQUEST_TOKEN
					.getAuthorizationURL());
		}

	}

	public boolean almacenarCredenciales(String pin) {
		boolean resultado = false;

		try {
			// con el pin y la url, obtenemos el token de acceso
			AccessToken accessToken = ConstantesTwitter.TWITTER
					.getOAuthAccessToken(ConstantesTwitter.REQUEST_TOKEN, pin);
			// guardamos los tokens de acceso
			this.guardarDatos(ACCESS_TOKEN, accessToken.getToken());
			// y el token secreto de la aplicacion
			this.guardarDatos(TOKEN_SECRET, accessToken.getTokenSecret());
			resultado = true;

		} catch (TwitterException te) {
			System.out.println("Failed to get access token, caused by: "
					+ te.getMessage());
			System.out.println("Retry input PIN");
		}
		return resultado;

	}

	public boolean iniciado() {
		// Obtiene un booleano almacenado en las preferencias de nombre
		// initialized. El segundo parametro indica el valor a devolver si no lo
		// encuentra, en este caso, falso.
		return ConstantesTwitter.SHARED_PREFERENCES.getBoolean(INITIALIZED,
				false);
	}

	public void guardarDatos(String clave, String valor) {
		// Obtenemos el editor de las preferencias.
		Editor editor = ConstantesTwitter.SHARED_PREFERENCES.edit();
		// metemos las variables que nos han pasado
		editor.putString(clave, valor);
		// guardamos la clave de iniciar a true
		editor.putBoolean(INITIALIZED, true);
		// guardamos los valores
		editor.commit();
	}

	public void guardarDatos(String clave, boolean valor) {
		// Obtenemos el editor de las preferencias.
		Editor editor = ConstantesTwitter.SHARED_PREFERENCES.edit();
		// metemos las variables que nos han pasado
		editor.putBoolean(clave, valor);
		// guardamos la clave de iniciar a true
		editor.putBoolean(INITIALIZED, true);
		// guardamos los valores
		editor.commit();
	}

	public List<String> obtenerTimeLine() {
		List<String> resultado = new ArrayList<String>();
		try {
			ResponseList<twitter4j.Status> list;
			// obtenemos el timeline
			 list = ConstantesTwitter.TWITTER.getHomeTimeline();
			// otra posibilidad
//			list = ConstantesTwitter.TWITTER.getPublicTimeline();

			for (twitter4j.Status each : list) {
				// String a = each.getUser().getScreenName().toLowerCase();
				// comprobamos que el twitt sea de MUSIDeusto
				// if ((each.getUser().getScreenName().toLowerCase())
				// .equals("musideusto")) {
				// el twitt es de musideusto, por lo que lo guardamos
				resultado.add("@" + each.getUser().getScreenName() + " - "
						+ each.getText());
				// }
			}

		} catch (TwitterException e) {
			// TODO: handle exception
			e.printStackTrace();
		}
		return resultado;
	}

	@Override
	protected List<String> doInBackground(String... params) {
		// posibilidades
		// [VALIDAR-ACTUALIZAR]
		// [PIN]- parametro 2 es el pin

		String accion = params[0];
		List<String> listaResultado = null;
		if ((accion != null)) {
			if (accion.equals("VALIDAR-ACTUALIZAR")) {
				// validar

				try {
					// iniciamos el cliente
					this.iniciarElCliente();
					// comprobamos que el cliente tenga todos los datos que
					// necesite
					if (this.clienteTieneDatosQueNecesita()) {
						// actualizar el timeline
						listaResultado = this.obtenerTimeLine();
					}

				} catch (Exception e) {
					// TODO: handle exception
					e.printStackTrace();
				}
			} else if (accion.equals("PIN")) {
				String pin = params[1];
				this.almacenarCredenciales(pin);
			}
		}
		// si no hay nada, devolvemos null
		return listaResultado;
	}

	@Override
	protected void onPostExecute(List<String> result) {
		if (result != null) {
			this.actividad.actualizarTimelineMUSIDeusto(result);
		}
	}
}
